102. 二叉树的层序遍历

102. 二叉树的层序遍历

题目链接

代码随想录

分析

我最开始的想法,是先用中序遍历遍历所有元素(这样,同一层的左边的元素始终排在这一层右边的元素的前面),同时带高度信息,将遍历结果结果放到一个列表里面,然后从头遍历列表,根据节点的高度,来将节点进行分离。

但是官方答案更巧妙,直接使用队列这个数据结构,具体过程如下:

思路是

创建一个队列,并将根节点放入其中,注意根节点可能为空。

其巧妙的地方在于:

这个题也可以用递归来做,但是没有那么巧妙,还是用队列来做简洁高明。

层序遍历或者说广度优先遍历的本质,就是一层层的遍历。

解题

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> result = new ArrayList<>();
        Deque<TreeNode> queue = new ArrayDeque<>();
        if(root!=null){
            queue.offer(root);
        }
        while(!queue.isEmpty()){
            // 这里一次循环就是遍历一层的节点
            // 获取这一层的长度
            int size = queue.size();
            List<Integer> list = new ArrayList<>();
            for(int i=0;i<size;i++){
                TreeNode node = queue.poll();
                list.add(node.val);
                // 移除一个节点的时候,将其子节点放到队列中
                if(node.left!=null){
                    queue.offer(node.left);
                }
                if(node.right!=null){
                    queue.offer(node.right);
                }
            }
            result.add(list);
        }
        return result;
    }
}

相关题

107. 二叉树的层序遍历 II

199. 二叉树的右视图

637. 二叉树的层平均值

429. N 叉树的层序遍历

515. 在每个树行中找最大值

116. 填充每个节点的下一个右侧节点指针

117. 填充每个节点的下一个右侧节点指针 II

104. 二叉树的最大深度

111. 二叉树的最小深度